package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.service.IServicioOrdenCompraServicio;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.ResultadoValidacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.entidad.OrdenCompraServicio;
import pe.com.cotelasa.scp.entidad.OrdenPedido;

/**
 * @author zer0
 */
@Service
public class ServicioOrdenCompraServicioImpl implements IServicioOrdenCompraServicio, Serializable {

    @Inject
    private IDAOOrdenCompraServicio daoOrdenCompraServicio;

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCompraServiciosActivas() throws ServiceException {
        try {
            return daoOrdenCompraServicio.listarActivos(OrdenCompraServicio.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> listarTodasOrdenCompraServicios() throws ServiceException {
        try {
            return daoOrdenCompraServicio.listarTodos(OrdenCompraServicio.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoValidacion validarOrdenCompraServicio(OrdenCompraServicio ordenCS) throws ServiceException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ResultadoServicio guardarOrdenCompraServicio(OrdenCompraServicio ordenCS) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            //ordenCS.setId(5);
            System.out.println("orden pedido: " + ordenCS.getIdOrdenPedido());
            if (ordenCS.getIdOrdenPedido().getId() == 0) {
                ordenCS.setIdOrdenPedido(null);
            }
            ordenCS.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoOrdenCompraServicio.insertar(ordenCS);
        } catch (DAOException ex) {
            ex.printStackTrace();
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio.setMensaje("Ocurrio un problema al tratar de guardar el ordenCS.");
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public OrdenCompraServicio conseguirOrdenCompraServicioPorId(Integer idOrdenCompraServicio) throws ServiceException {
        try {
            return daoOrdenCompraServicio.obtenerEntidadPorId(OrdenCompraServicio.class, idOrdenCompraServicio);
        } catch (DAOException ex) {
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public ResultadoServicio actualizarOrdenCompraServicio(OrdenCompraServicio ordenCS) throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            if (ordenCS.getIdOrdenPedido() == null) {
                ordenCS.setIdOrdenPedido(null);
            }
            daoOrdenCompraServicio.actualizar(ordenCS);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCompraServiciosPorFiltro(OrdenCompraServicio ordenCS) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            if (ordenCS.getIdOrdenPedido().getId() != null) {
                parametro.put("idOrdenPedido", ordenCS.getIdOrdenPedido().getId());
            }
            parametro.put("idOrdenPedido.idEmpresa", ordenCS.getIdOrdenPedido().getIdEmpresa().getId());
            parametro.put("codigo", ordenCS.getCodigo());
            parametro.put("descripcion", ordenCS.getDescripcion());
            parametro.put("estadoOrden", ordenCS.getEstadoOrden());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            parametro.put("tipo", "" + ordenCS.getTipo());
            return daoOrdenCompraServicio.obtenerColeccionEntidadPorFiltros(OrdenCompraServicio.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCompraServiciosConCodigo(OrdenCompraServicio ordenCS) throws ServiceException {
        try {
            return daoOrdenCompraServicio.listarOrdenCompraServiciosConCodigo(ordenCS);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCSConCodigoPorOP(OrdenCompraServicio ordenCS, String[] listaEstado) throws ServiceException {
        try {
            return daoOrdenCompraServicio.listarOrdenCSConCodigoPorOP(ordenCS, listaEstado);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCompraServicioPorNroOrden(String nroOrden,
            String estadoOrdenOS, int idEmpresa) throws ServiceException {
        try {
            return daoOrdenCompraServicio.listarOrdenCompraServicioPorNroOrden(nroOrden, estadoOrdenOS, idEmpresa);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public OrdenCompraServicio obtenerOrdenCSPorCodigo(OrdenCompraServicio ordenCS)
            throws ServiceException {
        try {
            return daoOrdenCompraServicio.obtenerOrdenCSPorCodigo(ordenCS);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> listarOrdenCSPorOP(OrdenCompraServicio ordenCS) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("idOrdenPedido", ordenCS.getIdOrdenPedido().getId());
            parametro.put("idOrdenPedido.idEmpresa", ordenCS.getIdOrdenPedido().getIdEmpresa().getId());
            parametro.put("estadoOrden", ordenCS.getEstadoOrden());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            return daoOrdenCompraServicio.obtenerColeccionEntidadPorFiltros(OrdenCompraServicio.class, parametro);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<OrdenCompraServicio> buscarOrdenCompraServiciosPorFiltro(OrdenCompraServicio ordenCS, Date fechaInicio, Date fechaFinal)
            throws ServiceException {
        Collection<OrdenCompraServicio> listaOrdenCS = null;
        try {
            listaOrdenCS = daoOrdenCompraServicio.buscarOrdenCompraServiciosPorFiltro(ordenCS, fechaInicio, fechaFinal);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return listaOrdenCS;
    }

    @Override
    public Collection<OrdenCompraServicio> buscarOrdenCSReporte(OrdenCompraServicio ordenCS, String[] listaEstado, Date fechaInicio, Date fechaFinal) throws ServiceException {
        try {
            return daoOrdenCompraServicio.buscarOrdenCSReporte(ordenCS, listaEstado, fechaInicio, fechaFinal);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioOrdenCompraServicioImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public int buscarCantidadOC(OrdenCompraServicio ordenCompra) throws ServiceException {
        try {
            return daoOrdenCompraServicio.buscarCantidadOC(ordenCompra);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public int buscarCantidadOS(OrdenCompraServicio ordenServicio) throws ServiceException {
        try {
            return daoOrdenCompraServicio.buscarCantidadOS(ordenServicio);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
